package cn.edu.zxj.ojspring.util;

import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;

/**
 * Created with IntelliJ IDEA.
 * Description：实现通过命令行调用程序, 将标准输出和标准错误, 重定向到文件中
 *
 * @author: zxj
 * @date: 2024-02-20
 * @time: 12:25:51
 */
public class CommandUtils {
    /**
     * @description:
     * 1. 通过 Runtime 获取到 Runtime 对象, 这是一个单例对象.
     *    然后 exec 得到 Process 对象
     * 2. 对标准输出进行重定向.
     * 3. 对标准错误进行重定向
     * 4. 等待程序结束.
     **/
    public static int run(String cmd,String stdoutFile,String stderrFile) {
        try {
            // 1. 通过 Runtime 获取到 Runtime 对象, 这是一个单例对象. 然后 exec 得到 Process 对象
            Process process = Runtime.getRuntime().exec(cmd);

            // 2. 将标准输出进行重定向
            if (stdoutFile != null) {
                InputStream stdoutFrom = process.getInputStream();
                OutputStream stdoutTo = Files.newOutputStream(Paths.get(stdoutFile));
                redirectFile(stdoutFrom,stdoutTo);
                stdoutFrom.close();
                stdoutTo.close();
            }

            // 3. 对标准错误进行重定向
            if (stderrFile != null) {
                InputStream stderrFrom = process.getErrorStream();
                OutputStream stderrTo = Files.newOutputStream(Paths.get(stderrFile));
                redirectFile(stderrFrom,stderrTo);
                stderrFrom.close();
                stderrTo.close();
            }

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return -1;
    }

    private static void redirectFile(InputStream from, OutputStream to) throws IOException {
        while (true) {
            int ch = from.read();
            if (ch == -1) {
                break;
            }
            to.write(ch);
        }
    }
}
